home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / WarriorsProgress.sit / Warrior’s Progress / source code / Source / Libraries / Context / Context.cp next >
Text File  |  1997-06-28  |  2KB  |  126 lines

  1. // Context.cp
  2.  
  3. #ifndef Context_h
  4. #include "Context.h"
  5. #endif
  6. #ifndef Assert_h
  7. #include "Assert.h"
  8. #endif
  9. #ifndef ContextMaintainer_h
  10. #include "ContextMaintainer.h"
  11. #endif
  12.  
  13. Context *Context::current = 0;
  14.  
  15. Context::Context()
  16.   : parent( current ),
  17.      users( 0 ),
  18.      active( true )
  19.   {
  20.     current = this;
  21.     if ( parent != 0 )
  22.       {
  23.         Assert( parent->users < maxuint32 );
  24.         parent->users++;
  25.       }
  26.   }
  27.  
  28. Context::~Context()
  29.   {
  30.     Assert( users == 0 );
  31.     Assert( !active );
  32.     if ( parent != 0 )
  33.       {
  34.         Assert( parent->users > 0 );
  35.         parent->users--;
  36.       }
  37.     
  38.     ContextMaintainer::StopMaintaining( this );
  39.   }
  40.  
  41. void Context::Activate()
  42.   {
  43.     Assert( !active );
  44.     Assert( parent == current );
  45.     Enter();
  46.     active = true;
  47.     current = this;
  48.   }
  49.  
  50. void Context::Deactivate()
  51.   {
  52.     Assert( active );
  53.     Assert( this == current );
  54.     if ( useAssertions )
  55.         Check();
  56.     Leave();
  57.     active = 0;
  58.     current = parent;
  59.   }
  60.  
  61. void Context::BeCurrent()
  62.   {
  63.     BeActive();
  64.  
  65.     while ( current != this )
  66.       {
  67.         Assert( current != 0 );
  68.         current->Deactivate();
  69.       }
  70.   }
  71.  
  72. void Context::BeActive()
  73.   {
  74.     if ( active )
  75.         return;
  76.     
  77.     if ( parent == 0 )
  78.         LeaveAll();
  79.      else
  80.         parent->BeCurrent();
  81.     
  82.     Activate();
  83.   }
  84.  
  85. void Context::LeaveAll()
  86.   {
  87.     while ( current != 0 )
  88.         current->Deactivate();
  89.   }
  90.  
  91. void Context::BeInactive()
  92.   {
  93.     while( active )
  94.       {
  95.         Assert( current != 0 );
  96.         current->Deactivate();
  97.       }
  98.   }
  99.  
  100. void Context::CheckActive()
  101.   {
  102.     for ( Context *c = current; c != 0; c = c->parent )
  103.         c->Check();
  104.   }
  105.  
  106. void Context::ReenterActive()
  107.   {
  108.     if ( current != 0 )
  109.         current->ReenterWithParents();
  110.   }
  111.  
  112. void Context::ReenterWithParents()
  113.   {
  114.     if ( parent != 0 )
  115.         parent->ReenterWithParents();
  116.     Reenter();
  117.   }
  118.  
  119. void Context::Set( Context *c )
  120.   {
  121.     if ( c == 0 )
  122.         LeaveAll();
  123.      else
  124.         c->BeCurrent();
  125.   }
  126.